package cn.org.eshow.service;

import cn.org.eshow.bean.query.ProductOrderQuery;
import cn.org.eshow.common.page.Page;
import cn.org.eshow.model.*;
import com.pingplusplus.model.Charge;
import com.pingplusplus.model.Refund;

import javax.jws.WebService;
import java.util.List;

@WebService
public interface ProductOrderManager extends GenericManager<ProductOrder, Integer> {

    List<ProductOrder> list(ProductOrderQuery query);

    Page<ProductOrder> search(ProductOrderQuery query);

    ProductOrder check(ProductOrderQuery query);

    Integer count(ProductOrderQuery query);

    void pay(Charge charge);

    /**
     * 购物车商品订单保存
     *
     * @param productOrder 已保存过(有id)的订单
     * @param user         下单人
     * @param carts        购物车
     * @param address
     * @return
     */
    ProductOrder save(ProductOrder productOrder, User user, List<Cart> carts, Address address);


    /**
     * 商品订单保存
     *
     * @param productOrder
     * @param user
     * @param productItemIds
     * @param quantities
     * @param address
     * @return
     */
    ProductOrder save(ProductOrder productOrder, User user, String productItemIds, String quantities, Address address);


    /**
     * 取消 待付款 订单(返回优惠券)
     *
     * @param productOrder
     * @return
     */
    ProductOrder cancel(ProductOrder productOrder);

    List<ProductOrder> list(String hql, Object[] params);

    void refund(Refund refund);


    /**
     * 退款流程
     * 向ping++发起退款申请
     *
     * @param productOrder 同意退款的订单
     * @param refundPrice  退款金额
     */
    ProductOrder executeRefund(ProductOrder productOrder, Double refundPrice);

    /**
     * 后台 接单
     *
     * @param productOrder
     * @return
     */
    ProductOrder delivery(ProductOrder productOrder);

    /**
     * 用户/后台 确认收货
     *
     * @param productOrder
     * @return
     */
    ProductOrder conform(ProductOrder productOrder);

    /**
     * 更新月销量
     *
     * @param productOrder
     * @return
     */
    void updateSales(ProductOrder productOrder);


    /**
     * 更新订单地址
     *
     * @param productOrder
     * @param address
     * @return
     */
    ProductOrder updateAddress(ProductOrder productOrder, Address address);


    /**
     * 导出到excel
     * @param productOrders
     * @return
     */
    String exportExcel(List<ProductOrder> productOrders);


}